问题:

Activity有很多种启动方式,app启动,不同app互相调,安装完点打开、点击桌面图标等等。
当activity的launchIntent中的flag不同的时候,就会创建实例,从而导致重复的问题。用户比较容易感知的就是安装完点打开,然后点击home,再点击桌面,此时会出现情况如下:

1
2
3
4
5
6
7
8
9
10
11
12
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val myPid = Process.myPid()
LogUtils.d(
"""
isTaskRoot:${isTaskRoot}
pid:$myPid
activityList:${ActivityUtils.getActivityList()}
"""
)
}

打印结果:

1
2
3
4
5
6
7
8
9

│ isTaskRoot:true
│ pid:10731
│ activityList:[com.optimais.demo.MainActivity@dfbbc47]
└─────────────────

│ isTaskRoot:false
│ pid:10731
│ activityList:[com.optimais.demo.MainActivity@dfbbc47, com.optimais.demo.MainActivity@c383d34]

可以看到第二次从桌面直接点击图标启动的时候,pid是相同的,isTaskRootfalse了,栈内压了2个MainActivity

解决:

  1. onCreate里默默的加上一个if(isTaskRoot()) finish()退掉好了。
  2. 更常见的做法是,首页的launchMode通常会设置为android:launchMode="singleTask"栈内唯一即可